package Java1_228.Java_promotion_136_228.Java190_198__接口;

/**
 * 接口的基本格式：
 * public interface 接口名称{
 * //......
 * }
 * <p>
 * 接口中可以包含的组成部分：
 * 1.抽象方法————————重点
 * 2.常量
 * 3.默认方法（Java 8 ）
 * 4.静态方法（Java 8 ）
 * 5.私有方法（Java 9 ）
 * <p>
 * 如何定义一个抽象方法：
 * <p>
 * public abstract 返回值类型 方法名称（参数类型 参数名称）；
 * <p>
 * 注意：
 * 1.接口中的抽象方法，修饰符如果写必须是：public abstract
 * 2.接口中的抽象方法，修饰符可以省略不写，默认就是public abstract
 * 3.抽象方法只有方法头，没有方法体（不能有大括号）。
 * <p>
 * 如果想要定义好接口，必须有一个接口的“实现类”
 * 定义实现类格式为：
 * <p>
 * public class 实现类名称 implements 接口名称{
 * //一定要覆盖重写的所有对象
 * }
 * 什么是覆盖重写（Override）抽象方法？
 * 1.将接口中的抽象方法复制过来
 * 2.去掉abstract关键字
 * 3.写上大括号{方法体}
 * <p>
 * cat就是animal接口的实现类，cat类的实现了animal接口
 * <p>
 * 如何使用接口和实现类？
 * <p>
 * 创建：
 * 接口名称 引用名=new 实现类名称（）；
 * <p>
 * 调用：
 * 引用名.抽象方法名（参数）
 * <p>
 * 注意：
 * 1.左边是接口的类型，那么只能调用接口当中定义好的内容，不能调用右侧实现类的中的特有的内容。（接口隔离）
 * 2.当调用接口当中抽象方法时，真正运行的是右侧new的时候类的具体方法内容
 * 3.调用的时候看左边   ，运行的时候看右边
 * <p>
 * 使用接口作为左侧类型的好处。
 * 1.屏蔽掉了右侧的个性特有的内容，达到隔离统一的目的。
 * <p>
 * 面向接口编程 ：
 * 如果使用的功能接口已经可以满足了，那么就不在乎具体的类是谁，是在乎接口的。
 */
public class Cat implements Animal {

    @Override
    public void eat() {
        System.out.println("猫吃鱼");
    }

    @Override
    public void sleep() {
        System.out.println("猫睡觉");
    }

    //    这是cat自己特有的方法，在接口中并没有定义
    public void catchMouse() {
        System.out.println("猫抓老鼠");
    }
}

class Dog implements Animal {

    public void eat() {
        System.out.println("狗吃骨头");
    }

    public void sleep() {
        System.out.println("狗睡觉");
    }

    public void watchhouse() {
        System.out.println("狗看家");
    }
}

interface Animal {
    //    定义一个抽象方法：吃东西
    public abstract void eat();

    //    定义另一个抽象方法：睡觉
    void sleep();//省略了public abstract也是抽象方法

/*    public static void main(String[] args) {

    }*/
}

class Demo02Interface {
    public static void main(String[] args) {
        Cat cat = new Cat();
        Dog dog = new Dog();
        cat.eat();
        cat.sleep();
        dog.eat();
        dog.sleep();
    }

    public static void method(Cat cat) {
        cat.eat();
        cat.sleep();
    }

    public static void method(Dog dog) {
        dog.eat();
        dog.sleep();
    }
}

//对Demo02Interface的优化

/*
class Demo03Interface {
    public static void main(String[] args) {
        Cat cat = new Cat();
        Dog dog = new Dog();
        method(cat);
        method(dog);
    }

    public static void method(Animal animal) {
        animal.eat();
        animal.sleep();
    }
}
*/





